from channels.exceptions import StopConsumer
from channels.generic.websocket import WebsocketConsumer
# 异步改成同步
from asgiref.sync import async_to_sync
import datetime
import json
from chart_web import models


class ChatConsumer(WebsocketConsumer):
    def websocket_connect(self, message):
        """客户端请求建立链接时 自动触发"""
        # 进行握手(服务端允许与客服端进行链接)
        self.accept()  # 建立链接  并且自动帮你维护每一个客户端
        # 服务端主动向客服端发送信息 self--当前链接对象
        # self.send('当前用户为，链接成功')

        # 2.群聊功能
        # 将这个客户端对象加入到内存中 self.channel_name--当前链接对象的随机别名
        # 获取当前组名,路由匹配中的
        group = self.scope['url_route']['kwargs'].get('group')
        async_to_sync(self.channel_layer.group_add)(group, self.channel_name)  # 异步转同步

    def websocket_receive(self, message):
        """客户端发送数据过来  自动触发"""
        # 浏览器基于websocket向服务端发送数据，自动触发
        # message-----{'type': 'websocket.receive', 'text': '口袋VS'}
        """
        if message['text'] == '关闭':
            self.close()
            # 如果服务端主动断开断开链接时，执行StopConsumer异常，那么websocket_disconnect就不会在执行
            raise StopConsumer()
            return
        txt = '_say:{}'.format(message['text'])
        self.send(txt)
        # 服务端主动向客服端发送信息
        # self.send('小心电信诈骗')  # 只给一个人发
        # 服务端主动断开
        # self.close()
        """
        # 通知当前组内所有的对象执行test的方法，在此方法中自己可以去定义任意的功能
        group = self.scope['url_route']['kwargs'].get('group')
        # 存数据库
        # message {'type': 'websocket.receive', 'text': '{"txt":"看到v吗","requestObj":"我不是大头"}'}
        # print(json.loads(message['text']))
        # 查询当前对象
        username = json.loads(message['text'])['requestObj']
        content = json.loads(message['text'])['txt']
        user_obj = models.UserInfo.objects.filter(username=username).first()
        if user_obj:
            models.ChartRoom.objects.create(
                chart_type=1,
                content=content,
                userinfo=user_obj,
                channel_name=self.channel_name,
            )
        else:
            self.close()
        async_to_sync(self.channel_layer.group_send)(group, {'type': 'test.xx', 'message': message})

    def test_xx(self, event):
        # print(json.loads(event['message']))
        # json.loads(event['message']['text']) ---- {'txt': '里面v的', 'requestObj': '我不是大头'}
        text = json.loads(event['message']['text'])['txt']
        # 给组内每一个人都发
        self.send(text)

    def websocket_disconnect(self, message):
        """客户端断开链接之后  自动触发"""
        # 只要是主动执行了断开链接，就会触发
        group = self.scope['url_route']['kwargs'].get('group')
        # print('断开链接')
        async_to_sync(self.channel_layer.group_discard)(group, self.channel_name)

        raise StopConsumer()
